import java.util.Scanner;

public class demo {
    // 发邮件▲▲▲
//NowCoder每天要给很多人发邮件。有一天他发现发错了邮件，把发给A的邮件发给了B，把发给B的邮件发给了A。于是他就思考，要给n个人发邮件，
//在每个人仅收到1封邮件的情况下，有多少种情况是所有人都收到了错误的邮件？即没有人收到属于自己的邮件。
//    输入描述:
//输入包含多组数据，每组数据包含一个正整数n（2≤n≤20）。
//    输出描述:
//对应每一组数据，输出一个正整数，表示无人收到自己邮件的种数。
    public static void main1(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int n = scanner.nextInt();
            // 因为结果很大 所以要用long类型来保存
            long[] f = new long[21];
            f[2] = 1;
            for (int i=3; i<21; i++) {
                f[i] = (i-1) * (f[i-1] + f[i-2]);
            }
            System.out.println(f[n]);
        }
    }




    // 最长上升子序列▲▲▲
//广场上站着一支队伍，她们是来自全国各地的扭秧歌代表队，现在有她们的身高数据，请你帮忙找出身高依次递增的子序列。
// 例如队伍的身高数据是（1、7、3、5、9、4、8），其中依次递增的子序列有（1、7），（1、3、5、9），（1、3、4、8）等，其中最长的长度为4

//  输入描述:
//输入包含多组数据，每组数据第一行包含一个正整数n（1≤n≤1000）。
//紧接着第二行包含n个正整数m（1≤n≤10000），代表队伍中每位队员的身高。
//  输出描述:
//对应每一组数据，输出最长递增子序列的长度。
//          输入
//      7
//      1 7 3 5 9 4 8
//      6
//      1 3 5 2 4 6
//          输出
//      4
//      4

    // 动态规划
//我们先假设只有俩个数字，那么我们只需要看第二个数字是不是比第一个数字大，如果打的话就是2，否则就是1，那么我们现在假设有三个数字，
//我们先看前俩个数字，和刚才一样的方法，然后我们看第三个数字是不是比第二个数字大，大的话我们就在第二个数字对应的那个长度上加1为第三个数字，
//所以我们可以借助一个辅助数组来存储对应数字的长度，然后我们遍历一遍就可以得到最长的数字
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            // 获取数据
            int n = scanner.nextInt();
            int[] arr = new int[n];
            for (int i=0; i<n; i++) {
                arr[i] = scanner.nextInt();
            }

            // 创建辅助数组 保存每个数组值和之前比的最大长度
            int[] flagLen = new int[n];
            flagLen[0] = 1;
            int max = 1;
            for (int i=1; i<n; i++) {
                // 每个数 长度最少都有1
                flagLen[i] = 1;
                // 重点在这
                for (int j=0; j<i; j++) {
                    if (arr[i] > arr[j]) {
                        flagLen[i] = Math.max(flagLen[j]+1, flagLen[i]);
                    }
                }
                max = Math.max(max, flagLen[i]);
            }
            System.out.println(max);
        }
    }
}
